/* ============================================================================
* 功能描述 ：其他函数实现
* 作者       ：ggls
* 创建日期 ：2024.03.22
* ----------------------------------------------------------------------------
* 更新历史 ：
*	日期 　　- 修改者   : 更新内容描述
*
* ============================================================================
*/

#include "main.h"

/* 校验和函数 */
unsigned char checksum(unsigned char *str ,int len)
{
	int totalSum = 0;
	int i;

	for (i = 0; i < len; i++)
	{
		totalSum += *str++;
		// No need to calculate the modulus in each iteration
	}

	// Calculate the modulus after the loop
	totalSum %= 256;

	return (unsigned char)totalSum & 0xff;
}

void delayms(unsigned int t)
{
    unsigned int i, j;
    for (i = 0; i < t; i++) {
        for (j = 0; j < 2347; j++) {
            ; // 空循环，等待时间过去
        }
    }
}


void Delayus(unsigned int x)
{
	int i;
	for(i=x;i>0;i--)
	{
		
	}
		
}


/*
* \brief 获取当前当前时间距离 old_timestamp 已经过去的时间
 *
 * \param none
 * \retval timerValue In s
*/
uint32_t hly_get_elapsed_s(uint32_t old_timestamp)
{
  	uint32_t cur_ticks = get_current_s();

   //计算两者的时间戳差值
    if( cur_ticks < old_timestamp ) //脉冲数溢出情况
    {
        return( cur_ticks + ( 0xFFFFFFFF - old_timestamp ) );
    }
    
	return( cur_ticks - old_timestamp );
}


uint32_t hly_get_elapsed_ms(uint32_t old_timestamp)
{
  	uint32_t cur_ticks = get_current_ms();

   //计算两者的时间戳差值
    if( cur_ticks < old_timestamp ) //脉冲数溢出情况
    {
        return( cur_ticks + ( 0xFFFFFFFF - old_timestamp ) );
    }
    
	return( cur_ticks - old_timestamp );
}

void Mc_gpio_init(void)
{
	GPIO_SET_MUX_MODE(P24CFG, GPIO_MUX_GPIO);		// 设置P24为GPIO模式
	GPIO_ENABLE_INPUT(P2TRIS, GPIO_PIN_4);			// 设置为输入模式
	GPIO_ENABLE_UP(P2UP, GPIO_PIN_4);				// 开启下拉
	
	
	GPIO_SET_MUX_MODE(P25CFG, GPIO_MUX_GPIO);		// 设置P25为GPIO模式
	GPIO_ENABLE_INPUT(P2TRIS, GPIO_PIN_5);			// 设置为输入模式
	GPIO_ENABLE_UP(P2UP, GPIO_PIN_5);				// 开启下拉

	
	/* 设置中断方式 */
	GPIO_SET_INT_MODE(P24EICFG, GPIO_INT_RISING);	//上升沿触发中断
	GPIO_EnableInt(GPIO2, GPIO_PIN_4_MSK);			//开启P24中断
	
	GPIO_SET_INT_MODE(P25EICFG, GPIO_INT_RISING);	//设置为下降沿中断模式
	GPIO_EnableInt(GPIO2, GPIO_PIN_5_MSK);			//开启P25中断
	
	/*
	(3)设置中断优先级
	*/
	IRQ_SET_PRIORITY(IRQ_P2, IRQ_PRIORITY_LOW);
	/*
	(4)开启总中断
	*/	
	IRQ_ALL_ENABLE();
	

}


void ADC_Config(void)
{
	//设置ADC的运行模式
	ADC_ConfigRunMode(ADC_CLK_DIV_64, ADC_RESULT_LEFT);	//设置ADC时钟为系统时钟的256分频，ADC结果为左对齐，如有对ADC时钟有操作请参考"中微8051芯片ADC模块应用笔记"
	//设置ADC转换通道
	ADC_EnableChannel(ADC_CH_2);	
	GPIO_SET_MUX_MODE(P02CFG, GPIO_P02_MUX_AN2);	
	
	ADC_ConfigADCVref(ADC_VREF_2V);		//ADC_VREF_1P2V, ADC_VREF_2V, ADC_VREF_2P4V, ADC_VREF_3V	

	//设置ADC中断
	ADC_EnableInt();
	IRQ_SET_PRIORITY(IRQ_ADC,IRQ_PRIORITY_HIGH);	
	IRQ_ALL_ENABLE();
}

u16 Obtain_voltage(void)
{
	u16 adc_result;
	P04 = 1;
	delayms(20);
	//设置ADC LDO
	ADC_EnableLDO();
	delayms(1);
	//开启ADC
	ADC_Start();

	ADC_GO();
	while(ADC_IS_BUSY);
	adc_result = ADC_GetADCResult();

	ADC_Stop();
	ADC_DisableLDO();
	P04 = 0;

	return adc_result;

}


char voltage_percentage(u16 ch)
{
	char i;
	char val = 0;
	double adc_max = 3108, adc_min = 2611, jx = ch;
	double rangeDiff = adc_max - adc_min;
	
	if(jx >= adc_max)
	{
		val = 100;
		return val;
	}
	if(jx > adc_min)
	{
		val = ((jx - adc_min)/rangeDiff)*100;
		return val;
	}
	if(jx <= adc_min)
	{
		val = 0;
		return val;
	}
	

}

void hly_Obtain_voltage(void)
{
	u16 adc,adc_avg;
	char i, val, ch[3];
	adc_avg = Obtain_voltage();
	for(i = 0; i < 10 ; i++)
	{
		adc = Obtain_voltage();
		adc_avg = (adc + adc_avg)/2;
	}
	ch[0] = SHORT_GET_HIGH_BYTE(adc_avg);
	ch[1] = SHORT_GET_LOW_BYTE(adc_avg);

	Uart_Tx_buf(ch, 2);
	
	val = voltage_percentage(adc_avg);
	app_data.power_supply = val;
}


